package com.free.sequence.basic;

import com.free.sequence.ENUM_SEQUENCE_FORMAT;
import com.free.sequence.ISequence;
import com.free.utils.DateUtils;
import org.apache.commons.lang3.StringUtils;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * <p>
 * 功能概述:
 * </p>
 * <p>
 * 功能详述:
 * </p>
 */
public class BasicSequence implements ISequence {

    /*========================================================================*
     *                         Public Fields (公共属性)
     *========================================================================*/

    /*========================================================================*
     *                         Private Fields (私有属性)
     *========================================================================*/
    private static final BasicSequence _instance = new BasicSequence();

    private static final Object obj = new Object();

    private static final AtomicInteger actInteger = new AtomicInteger(0);
    /*========================================================================*
     *                         Construct Methods (构造方法)
     *========================================================================*/

    /*========================================================================*
     *                         Public Methods (公有方法)
     *========================================================================*/
    public static final BasicSequence instance(){
        return _instance;
    }

    @Override
    public String sequence(int length, String padStr) {
        return StringUtils.leftPad(String.valueOf(actInteger.incrementAndGet()), length, padStr);
    }

    @Override
    public String sequence(int length, String padStr, ENUM_SEQUENCE_FORMAT format) {
        String value = DateUtils.now(format.toString());
        StringBuffer strBuf = new StringBuffer();
        strBuf.append(value).append(padString(length - value.length(), padStr));
        return strBuf.toString();
    }

    @Override
    public String sequence(String prefix, int length, String padStr, ENUM_SEQUENCE_FORMAT format) {
        String value = DateUtils.now(format.toString());
        StringBuffer strBuf = new StringBuffer();
        strBuf.append(prefix).append(value).append(padString(length - value.length(), padStr));
        return strBuf.toString();
    }

    /*========================================================================*
     *                         Private Methods (私有方法)
     *========================================================================*/

    private String padString(int length, String padStr){
        if(length >0){
            return  StringUtils.leftPad(String.valueOf(actInteger.incrementAndGet()), length, padStr);
        }
        return StringUtils.EMPTY;
    }


    public static void main(String[] args) {
        System.out.println(StringUtils.leftPad("2",10));
        System.out.println(StringUtils.leftPad("3",10, "0"));
        AtomicInteger atc = new AtomicInteger(0);
        int res = actInteger.incrementAndGet();
        System.out.println(res);
        res = actInteger.incrementAndGet();
        System.out.println(res);
    }
}
